<?php

/**
 * Description de la classe CSV
 * La classe CSV permet de stocker et récupérer les fichiers CSV stockés sur le serveur
 */
class CSV {

    private $id;
    private $file_name;
    private $id_member;
    private $id_projet; // nom du projet

    /**
     * Constructeur de CSV
     * @param type $id
     * @param type $file_name
     * @param type $id_member
     * @param type $id_projet
     */

    public function __construct($id, $file_name, $id_member, $id_projet) {
        $this->id = $id;
        $this->file_name = $file_name;
        $this->id_member = $id_member;
        $this->id_projet = $id_projet;
        //print_r($this);
    }

    /**
     * Getter CSV id
     * @return type int
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Getter CSV file_name
     * @return type string
     */
    public function getFileName() {
        return $this->file_name;
    }

    /**
     * Getter CSV idMember
     * @return type int
     */
    public function getIdMember() {
        return $this->id_member;
    }

    /**
     * Getter CSV id_projet
     * @return type int
     */
    public function getIdProjet() {
        return $this->id_projet;
    }

    /**
     * Sauvegarde du fichier CSV en base de données
     * !!! Uniquement le nom est sauvegardé en base de données, le fichier est quant à lui stocker sur le serveur
     */
    public function save($entryPoint) {
        Log::createLog("CSV::try ");
        Sql::exec("INSERT INTO wsk_csv (file_name, id_member, id_project) VALUES ('" . $this->file_name . "', '" . $this->id_member . "', '" . $this->id_projet . "')");

        switch ($entryPoint) {
            case "data":
                Log::createLog("CSV::try - data ");
                $this->insertDataFromCSV();
                Log::createLog("CSV::try - data end");
                break;
            case "service":
                $this->insertServiceFromCSV();
                break;
            default:

                break;
        }
    }

    /**
     * Fonction de mise à jour d'un fichier CSV
     */
    public function update() {
        Sql::exec("UPDATE wsk_csv SET file_name = '" . $this->file_name . "', id_member='" . $this->id_member . "', id_project='" . $this->id_projet . "where _id = '" . $this->id . "'");
    }

    /**
     * Fonction permettant de supprimer un fichier CSV
     */
    public function delete() {
        Sql::exec("DELETE FROM wsk_csv WHERE _id = $this->id");
    }

    /**
     * Retourne une liste contenant la totalité des fichiers CSV
     * @return List of CSV
     */
    public static function getCSVs() {

        $list = Array();

        $req = mysql_query("SELECT * FROM wsk_csv");
        while ($row = mysql_fetch_array($req)) {
            $list[] = new CSV($row["_id"], $row["file_name"], $row["id_member"], $row["id_projet"], $row["date"]);
        }

        return $list;
    }

    /**
     * Retourne un fichier CSV par son nom
     * @return CSV
     */
    public static function getCSVByName($file_name) {
        $req = mysql_query("SELECT * FROM wsk_csv WHERE file_name = '" . $file_name . "'");

        while ($row = mysql_fetch_array($req)) {
            $csv = new CSV($row["_id"], $row["file_name"], $row["id_member"], $row["id_projet"], $row["date"]);
        }

        return $csv;
    }

    /**
     * Fonction permettant de créer une table projet par rapport à ce que l'administrateur du site a saisi
     * @param type $project nom du projet à créer
     */
    public function createProjectTable($project) {
        // début de la requête de création de la table
        $sql = "CREATE TABLE wsk_" . $project->getProjectName();

        // ouverture du fichier
        $handle = fopen("tmp/files/" . $this->file_name, "r");

        // création des id unique de la table
        $sql .="(_id int(32) unsigned NOT NULL auto_increment,";

        // deuxième requête pour l'ajout des colonnes d'un projet
        $sql2 .="Insert into wsk_columns ('id_project', 'column_name', 'column_usual_name', 'order', 'date_created') values (";
        $data = fgetcsv($handle, 1000, ";");
        $num = count($data);

        for ($c = 0; $c < $num; $c++) {
            $sql .= ($c == ($num - 1) ) ? $data[$c] . " varchar(64), PRIMARY KEY (_id));  " : $data[$c] . " varchar(64), ";
        }
        $data2 = fgetcsv($handle, 1000, ";");
        $num = count($data);
        for ($c = 0; $c < $num; $c++) {
            $j = $c + 1;
            $sql2 .= ($c == ($num - 1) ) ? $data[$c] . "," . $data2[$c] . "," . $j . ",CURRENT_TIMESTAMP );  " : $data[$c] . "," . $data2[$c] . "," . $j . ",CURRENT_TIMESTAMP ),( ";
        }
        fclose($handle);

        // Essai de l'exécution des requêtes
        try {
            Sql::exec($sql);
            Sql::exec($sql2);
        } catch (Exception $e) {
            // s'exécute si il y a une erreur lors des requêtes
            die('Erreur : ' . $e->getMessage());
        }
    }

    /**
     * Fonction d'ajout des données depuis un fichier CSV
     */
    public function insertDataFromCSV() {
        Log::createLog("CSV::insertDataFromCSV ");

        // début de la requête
        $sql = "INSERT INTO `" . Project::getProjectByID($this->id_projet)->getTableName() . "` (";

        // si premier élément on initialise la variable à vrai
        $first = true;

        // ouverture du fichier CSV
        $handle = fopen("tmp/files/" . $this->file_name, "r");
        Log::createLog("CSV::insertDataFromCSV - before while ");

        // Tant que l'on n'a pas parcouru entièrement le fichier
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
            $num = count($data);

            // on ajoute les valeurs à la requête SQL
            for ($c = 0; $c < $num; $c++) {

                if ($first == true) {
                    $sql .= ($c == ($num - 1) ) ? $data[$c] . ") VALUES " : $data[$c] . ", ";
                }
                else
                    $sql .= (($c == 0) ? "('" . $data[$c] . "', '" : (($c == ($num - 1) ) ? $data[$c] . "'), " : $data[$c] . "', '"));
            }

            $first = false;
        }
        // fermeture du fichier CSV
        fclose($handle);

        $sql = substr($sql, 0, strlen($sql) - 2) . ";";

        // Exécution de la requête SQL d'insert
        try {
            Log::createLog("CSV::insertDataFromCSV - try " . $sql);
            Sql::exec($sql);
            //mysql_query($sql) or die('<META HTTP-EQUIV="Refresh" CONTENT="0;URL=main.php?page=0&error">');
            // die ('<META HTTP-EQUIV="Refresh" CONTENT="0;URL=error.php">');
        } catch (Exception $e) {
            Log::createLog("CSV::insertDataFromCSV - catch " . $e->getMessage());
            die('Erreur : ' . $e->getMessage());
        }
    }

    /**
     * Ajout des données de services depuis un fichier CSV
     */
    public function insertServiceFromCSV() {

        // début de la requête SQL    	
        $sql = "INSERT INTO wsk_services_data (id_project,";

        // ouverture du fichier CSV
        $first = true;
        $handle = fopen("tmp/files/" . $this->file_name, "r");

        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
            $num = count($data);
            // pour chaque ligne du fichier, on ajoute une ligne en base de données
            for ($c = 0; $c < $num; $c++) {

                if ($first == true) {
                    $sql .= ($c == ($num - 1) ) ? $data[$c] . ") VALUES " : $data[$c] . ", ";
                }
                else
                    $sql .= (($c == 0) ? "('" . $this->getIdProjet() . "', '" . $data[$c] . "', '" : (($c == ($num - 1) ) ? $data[$c] . "'), " : $data[$c] . "', '"));
            }

            $first = false;
        }
        // fermeture du fichier CSV
        fclose($handle);

        $sql = substr($sql, 0, strlen($sql) - 2) . ";";
        Log::createLog("\nsql import :  " . $sql);
        // On essaye d'exécuter la requête, si erreur, on passe dans le catch
        try {
            Sql::exec($sql);
        } catch (Exception $e) {
            die('Erreur : ' . $e->getMessage());
        }
    }

}

?>
